#include "rte.h"
#include "key.h"
#include "lock_uart.h"
#include "nfc_ctrl.h"
#include "pro_switch.h"
#include "check_current.h"
#include "nfc_read_switch.h"
#include "ledbuz_rte.h"
#include "ver_comp.h"
static Test_cases test_c;
/*
 * 函数介绍: Test_cases初始化
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void key_init(void)
{
    // test_c.c_pr = CURR_MAX;
    test_c.t_st = NOT_TESTED;
    test_c.start_keyStableState = true;
    test_c.eol_keyStableState = true;
    test_c.reset_keyStableState = true;
    test_c.Overcurrent_detected_flag = false;
}

/*
 * 函数介绍: 返回当前是哪个产品
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Curr_produ rt_Curr_produ(void)
{
    return test_c.c_pr;
}

/*
 * 函数介绍: 返回当前测试状态，是否在某个产品测试中
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Test_status rt_test_status(void)
{
    return test_c.t_st;
}

/*
 * 函数介绍: 产品选择按键检测
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Tool_program_button_detection(void)
{
    volatile static unsigned int frock_debounceCounter = 0; // 记录按键按下的开始时间
    /*如果有按键被按下，ReadKeyPin()返回0；否则返回1  */
    if (NOT_TESTED == test_c.t_st && (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOE, SW1_Pin) || 0 == RTE_GPIO_PIN_GET_LEVEL(GPIOE, SW2_Pin) || 0 == RTE_GPIO_PIN_GET_LEVEL(GPIOE, SW3_Pin)))
    {
        /*设置当前产品*/
        if (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOE, SW1_Pin))
        {
            test_c.c_pr = STEERING_LOCK;
        }
        else if (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOE, SW2_Pin))
        {
            test_c.c_pr = CARD_READER;
        }
        else
        {
            test_c.c_pr = CONTROLLER;
        }

        // 如果按键已经持续按下超过消抖时间，则确认按键按下事件
        // 处理按键按下事件...
    }
}

Rt_result start_key_reset(void)
{
    Rt_result rt = TEST_WAIT;
    if (STEERING_LOCK == test_c.c_pr)
    {
        if (NOT_TESTED == test_c.t_st && (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, START1_TEST_I_PA15_Pin)))
        {
            rt = TEST_OK;
        }
        else
        {
            rt = TEST_FAIL;
        }
    }
    else
    {
        if (NOT_TESTED == test_c.t_st && (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, START1_TEST_I_PA15_Pin) && 0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, START2_TEST_I_PA9_Pin)))
        {
            rt = TEST_OK;
        }
        else
        {
            rt = TEST_FAIL;
        }
    }
		return rt; 
}

/*
 * 函数介绍: 启动测试按键检测
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Start_button_detection(void)
{
    volatile static unsigned int start_debounceCounter = 0;
    /*如果按键被按下，ReadKeyPin()返回0；否则返回1  */
    if (TEST_OK == start_key_reset())
    {
        if (test_c.start_keyStableState)
        {                                            // 如果之前按键是稳定的（未按下状态）
            start_debounceCounter = RTE_GET_TIMER(); // 记录按键按下的开始时间
            test_c.start_keyStableState = false;     // 设置按键状态为不稳定
        }
        else if (RTE_TIMEOUT_JUDGMENT(start_debounceCounter, DEBOUNCE_TIME_MS))
        {
            Led_buzz_init();
            // 如果按键已经持续按下超过消抖时间，则确认按键按下事件
            test_c.t_st = DURING_TEST;
            // 处理按键按下事件...

            // 重置按键状态为稳定（未按下），等待下一次按键事件
            test_c.start_keyStableState = true;

            /*设置当前产品*/
            if (test_c.c_pr == STEERING_LOCK)
            {
                /*显示方向锁界面*/
                RTE_LCD_LCD_INTERFACE_SWITCHING(EHBL_TEST, true);
            }
            else if (test_c.c_pr == CARD_READER)
            {
                /*显示读卡器界面，显示测卡界面需要进入读卡器程序判断*/
                Nfc_read_rt();
            }
            else
            {
                /*显示控制器界面*/
                RTE_LCD_LCD_INTERFACE_SWITCHING(NFC_CONTROLLER_TEST, true);
            }
        }
    }
    if (STEERING_LOCK == test_c.c_pr)
    {
        if (NOT_TESTED == test_c.t_st && (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, START2_TEST_I_PA9_Pin)))
        {
            if (test_c.eol_keyStableState)
            {                                            // 如果之前按键是稳定的（未按下状态）
                start_debounceCounter = RTE_GET_TIMER(); // 记录按键按下的开始时间
                test_c.eol_keyStableState = false;       // 设置按键状态为不稳定
            }
            else if ((RTE_GET_TIMER() - start_debounceCounter) >= KEY_EOL_DLY)
            {
                if (true == Rt_eol_flag())
                {
                    RTE_LED_BUZZ(LED_RED, 1);
                    RTE_LED_CLOSE(LED_RED);
                    Set_eol_flag(false);
                }else{
                    RTE_LED_BUZZ(LED_GREEN, 1);
                    RTE_LED_CLOSE(LED_GREEN);
                    Set_eol_flag(true);
                }
                test_c.eol_keyStableState = true; // 设置按键状态为稳定
            }
        }
        else if (false == test_c.eol_keyStableState)
        {
            start_debounceCounter = 0;
            test_c.eol_keyStableState = true; // 设置按键状态为稳定
        }
    }
}

/*
 * 函数介绍: 手动复位按键检测
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Manual_reset_detection(void)
{
    volatile static unsigned int reset_debounceCounter = 0;
    /*如果按键被按下，ReadKeyPin()返回0；否则返回1  */
    if (0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, MANUAL_RESET_I_PA10_Pin))
    {
        if (test_c.reset_keyStableState)
        {                                            // 如果之前按键是稳定的（未按下状态）
            reset_debounceCounter = RTE_GET_TIMER(); // 记录按键按下的开始时间
            test_c.reset_keyStableState = false;     // 设置按键状态为不稳定
        }
        else if (RTE_TIMEOUT_JUDGMENT(reset_debounceCounter, DEBOUNCE_TIME_MS))
        {
            // 如果按键已经持续按下超过消抖时间，则确认按键按下事件
            test_c.t_st = NOT_TESTED;
            test_c.c_pr = CURR_MAX;
            // 处理按键按下事件...

            // 重置按键状态为稳定（未按下），等待下一次按键事件
            test_c.reset_keyStableState = true;
            /*此处要调用应用程初始化*/
            RTE_SW_RESET();
        }
        else
        {
        }
    }
}

/**
 * 在LCD上显示过电流保护信息
 *
 * 本函数用于根据传入的当前产品类型和状态，在LCD上显示相应的过电流保护信息。
 *
 * @param c_pr 当前产品类型，类型为Curr_produ枚举，用于确定是哪个产品发生了过电流。
 * @param status 状态信息，类型为Byte0Status，用于进一步描述过电流保护的状态。
 */
void Overcurrent_protection_lcd_show(Curr_produ c_pr, Byte0Status status)
{
    // 根据不同的产品类型，显示不同的过电流保护信息
    if (STEERING_LOCK == c_pr)
    {
        RTE_UART7_LCD_SHOW(EHBL_TEST, POWER_SHORT_CIRCUIT, status); /* 显示转向锁的过电流信息 */
        HAL_Delay(120);
        if (false == Rt_eol_flag())
        {
            RTE_UART7_LCD_SHOW(EHBL_TEST, LOCK_EHBL_QUIT_EOL, 0x02); /* 方向锁为点检模式 */
        }
    }
    else if (CARD_READER == c_pr)
    {
        RTE_UART7_LCD_SHOW(NFC_READER_TEST, POWER_SHORT_CIRCUIT, status); /* 显示卡读取器的过电流信息 */
    }
    else if (CONTROLLER == c_pr)
    {
        RTE_UART7_LCD_SHOW(NFC_CONTROLLER_TEST, POWER_SHORT_CIRCUIT, status); /* 显示控制器的过电流信息 */
    }
}

/*
 * 函数介绍: 过流保护
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Rt_result Overcurrent_protection_checking(void)
{
    Rt_result Overcurrent_protection_result = TEST_WAIT;                         /*过流保护检测结果*/
    if (DURING_TEST == test_c.t_st && false == test_c.Overcurrent_detected_flag) /*已按下开始按键*/
    {
        Overcurrent_protection_result = Overcurrent_protection(); /*过流保护检测*/
        if (TEST_OK == Overcurrent_protection_result)
        {
            test_c.Overcurrent_detected_flag = true; /*已经进行过流保护检测*/
            set_Overcurrent_only_once(true);         /*过流保护成功*/
            if (STEERING_LOCK == test_c.c_pr)
            {
                Modify_EHBL_testing_phase(COMMUNICATION_TEST); /*修改EHBL测试阶段*/
            }
            else if (CONTROLLER == test_c.c_pr)
            {
                Modify_NFCCTRL_testing_phase(CAN_COM_TEST); /*修改NFCCTRL测试阶段*/
            }
            else
            {
            }
            /*合格,LCD屏显示ok*/
            Overcurrent_protection_lcd_show(test_c.c_pr, STATUS_QUALIFIED);
        }
        else if (TEST_FAIL == Overcurrent_protection_result)
        {
            /*不合格，LCD屏显示错误*/
            Overcurrent_protection_lcd_show(test_c.c_pr, STATUS_UNQUALIFIED);
            test_c.Overcurrent_detected_flag = true; /*已经进行过流保护检测*/
        }
        else
        {
        }
    }
    return Overcurrent_protection_result;
}
